package com.shli.dao;

import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.orm.hibernate3.HibernateTemplate;


public class BaseDao<T>  {

    private Class<T> entityClass;


    @Autowired
    private HibernateTemplate hiberateTemplate;

    public BaseDao()
    {
        Type genType=getClass().getGenericSuperclass();

        Type[] params = ((ParameterizedType)genType).getActualTypeArguments();

        entityClass=(Class)params[0];
    }

    public T load(Serializable id)
    {
        return (T) getHiberateTemplate().load(entityClass, id);
    }

    public T get(Serializable id)
    {
        return (T) getHiberateTemplate().get(entityClass, id);
    }

    public List<T> loadAll()
    {
        return getHiberateTemplate().loadAll(entityClass);
    }

    public Serializable save(T entity)
    {
        return getHiberateTemplate().save(entity);
    }

    public void remove(T entity)
    {
         getHiberateTemplate().delete(entity);
    }

    public void update(T entity)
    {
         getHiberateTemplate().update(entity);
    }

    public List find(String sql)
    {
        return getHiberateTemplate().find(sql);
    }

    public List find(String sql, Object... params)
    {
        return getHiberateTemplate().find(sql, params);
    }

    public void initialize(Object entity)
    {
        this.getHiberateTemplate().initialize(entity);
    }

    public HibernateTemplate getHiberateTemplate() {
        return hiberateTemplate;
    }

    public void setHiberateTemplate(HibernateTemplate hiberateTemplate) {
        this.hiberateTemplate = hiberateTemplate;
    }
}
